package br.com.egg.finances.dao;

import java.sql.Connection;
import java.sql.Date;
import java.sql.PreparedStatement;
import java.sql.ResultSet;
import java.sql.Types;
import java.util.ArrayList;
import java.util.List;

import br.com.egg.finances.business.dao.util.BDUtils;
import br.com.egg.finances.business.exception.BusinessErrorException;
import br.com.egg.finances.model.ApropriacaoMovimento;
import br.com.egg.finances.model.Movimento;
import br.com.egg.finances.model.TipoMovimento;

public class MovimentoDAO extends DefaultDAO<Movimento> {

	@Override
	public void insert(Movimento entity) {
		Connection connection = null;
		PreparedStatement preparedStatement = null;
		try {
			StringBuilder sbInsert = new StringBuilder();
			sbInsert.append("INSERT INTO DEGGMOVIMENTO  ");
			sbInsert.append("VALUES (?, ?, ?, ?, ?, ?, ?, ?, ?, ?) ");

			String insert = sbInsert.toString();
			System.out.println(insert);

			Date dataMovimento = new Date(entity.getDtMovimento().getTime());
			
			connection = BDUtils.getConnection();
			preparedStatement = connection.prepareStatement(insert);
			preparedStatement.setString(1, entity.getCdUsuario());
			preparedStatement.setInt(2, entity.getCdMovimento());
			preparedStatement.setDate(3, dataMovimento);
			preparedStatement.setDouble(4, entity.getVlMovimento());
			preparedStatement.setString(5, String.valueOf(entity.getFlEntradaSaida()));
			preparedStatement.setString(6, entity.getDeMovimento());
			preparedStatement.setInt(7, entity.getCdTipoMovimento());
			preparedStatement.setNull(8, Types.INTEGER);
			preparedStatement.setNull(9, Types.INTEGER);
			preparedStatement.setString(10, entity.getCdConta());

			preparedStatement.executeUpdate();
			
			sbInsert = new StringBuilder();
			sbInsert.append("INSERT INTO DEGGAPROPRIACAOMOVIMENTO  ");
			sbInsert.append("VALUES (?, ?, ?, ?, ?) ");
			
			insert = sbInsert.toString();
			System.out.println(insert);
			
			ApropriacaoMovimento apropriacaoMovimento = entity.getApropriacaoMovimentoList().get(0);
			
			preparedStatement = connection.prepareStatement(insert);
			preparedStatement.setString(1, entity.getCdUsuario());
			preparedStatement.setInt(2, entity.getCdMovimento());
			preparedStatement.setInt(3, apropriacaoMovimento.getCdCentroCusto());
			preparedStatement.setString(4, apropriacaoMovimento.getCdCategoria());
			preparedStatement.setDouble(5, 100d);
			
			preparedStatement.executeUpdate();
		} catch (Exception e) {
			throw new BusinessErrorException(e);
		} finally {
			BDUtils.closeResources(connection, preparedStatement, null);
		}		
	}

	@Override
	public void update(Movimento entity) {
		Connection connection = null;
		PreparedStatement preparedStatement = null;
		try {
			StringBuilder sbUpdate = new StringBuilder();
			sbUpdate.append("UPDATE DEGGMOVIMENTO ");
			sbUpdate.append("SET DEMOVIMENTO = ?");
			sbUpdate.append("WHERE CDUSUARIO = ? AND CDMOVIMENTO = ? ");
			
			String update = sbUpdate.toString();
			System.out.println(update);
			
			connection = BDUtils.getConnection();
			preparedStatement = connection.prepareStatement(update);
			preparedStatement.setString(1, entity.getDeMovimento());
			preparedStatement.setString(2, entity.getCdUsuario());
			preparedStatement.setInt(3, entity.getCdMovimento());

			preparedStatement.executeUpdate();
		} catch (Exception e) {
			throw new BusinessErrorException(e);
		} finally {
			BDUtils.closeResources(connection, preparedStatement, null);
		}
	}

	@Override
	public void delete(Movimento entity) {
		Connection connection = null;
		PreparedStatement preparedStatement = null;
		try {
			StringBuilder sbDelete = new StringBuilder();
			sbDelete.append("DELETE FROM DEGGMOVIMENTO ");
			sbDelete.append("WHERE CDUSUARIO = ? AND CDMOVIMENTO = ? ");
			
			String delete = sbDelete.toString();
			System.out.println(delete);
			
			connection = BDUtils.getConnection();
			preparedStatement = connection.prepareStatement(delete);
			preparedStatement.setString(1, entity.getCdUsuario());
			preparedStatement.setInt(2, entity.getCdMovimento());

			preparedStatement.executeUpdate();
		} catch (Exception e) {
			throw new BusinessErrorException(e);
		} finally {
			BDUtils.closeResources(connection, preparedStatement, null);
		}
	}

	@Override
	public Movimento find(Movimento entityFilter) {
		Connection connection = null;
		PreparedStatement preparedStatement = null;
		ResultSet resultSet = null;
		Movimento movimento = null;
		try {
			StringBuilder sbSelect = new StringBuilder();
			sbSelect.append("SELECT MOV.CDUSUARIO AS CDUSUARIO, MOV.CDMOVIMENTO AS CDMOVIMENTO, MOV.DTMOVIMENTO AS DTMOVIMENTO, MOV.VLMOVIMENTO AS VLMOVIMENTO, ");
			sbSelect.append("MOV.FLENTRADASAIDA AS FLENTRADASAIDA, MOV.DEMOVIMENTO AS DEMOVIMENTO, MOV.CDTIPOMOVIMENTO AS CDTPMOVIMENTO, MOV.CDCREDIARIO AS CDCREDIARIO, ");
			sbSelect.append("MOV.NUPARCELA AS NUPARCELA, MOV.CDCONTA AS CDCONTA, TPMOVIMENTO.NMTIPOMOVIMENTO AS NMTPMOVIMENTO ");
			sbSelect.append("FROM DEGGMOVIMENTO MOV ");
			sbSelect.append("INNER JOIN DEGGTIPOMOVIMENTO TPMOVIMENTO ON TPMOVIMENTO.CDTIPOMOVIMENTO = MOV.CDTIPOMOVIMENTO ");
			sbSelect.append("WHERE CDUSUARIO = ? AND CDMOVIMENTO = ? ");
			
			String select = sbSelect.toString();
			System.out.println(select);
			
			connection = BDUtils.getConnection();
			preparedStatement = connection.prepareStatement(select);
			preparedStatement.setString(1, entityFilter.getCdUsuario());
			preparedStatement.setInt(2, entityFilter.getCdMovimento());

			resultSet = preparedStatement.executeQuery();
			if (resultSet.next()) {
				movimento = new Movimento();
				movimento.setCdUsuario(resultSet.getString("CDUSUARIO"));
				movimento.setCdMovimento(resultSet.getInt("CDMOVIMENTO"));
				movimento.setDtMovimento(resultSet.getDate("DTMOVIMENTO"));
				movimento.setVlMovimento(resultSet.getDouble("VLMOVIMENTO"));
				movimento.setFlEntradaSaida(resultSet.getString("FLENTRADASAIDA").charAt(0));
				movimento.setDeMovimento(resultSet.getString("DEMOVIMENTO"));
				movimento.setCdTipoMovimento(resultSet.getInt("CDTPMOVIMENTO"));
				movimento.setCdCrediario(resultSet.getInt("CDCREDIARIO"));
				movimento.setNuParcela(resultSet.getInt("NUPARCELA"));
				movimento.setCdConta(resultSet.getString("CDCONTA"));
				
				TipoMovimento tipoMovimento = new TipoMovimento();
				tipoMovimento.setCdTipoMovimento(resultSet.getInt("CDTPMOVIMENTO"));
				tipoMovimento.setNmTipoMovimento(resultSet.getString("NMTPMOVIMENTO"));
				
				movimento.setTipoMovimento(tipoMovimento);
			}
			
			return movimento;
		} catch (Exception e) {
			throw new BusinessErrorException(e);
		} finally {
			BDUtils.closeResources(connection, preparedStatement, resultSet);
		}
	}

	@Override
	public List<Movimento> findAll(String cdUsuario) {
		Connection connection = null;
		PreparedStatement preparedStatement = null;
		ResultSet resultSet = null;
		List<Movimento> movimentoList = new ArrayList<Movimento>();
		try {
			StringBuilder sbSelect = new StringBuilder();
			sbSelect.append("SELECT MOV.CDUSUARIO AS CDUSUARIO, MOV.CDMOVIMENTO AS CDMOVIMENTO, MOV.DTMOVIMENTO AS DTMOVIMENTO, MOV.VLMOVIMENTO AS VLMOVIMENTO, ");
			sbSelect.append("MOV.FLENTRADASAIDA AS FLENTRADASAIDA, MOV.DEMOVIMENTO AS DEMOVIMENTO, MOV.CDTIPOMOVIMENTO AS CDTPMOVIMENTO, MOV.CDCREDIARIO AS CDCREDIARIO, ");
			sbSelect.append("MOV.NUPARCELA AS NUPARCELA, MOV.CDCONTA AS CDCONTA, TPMOVIMENTO.NMTIPOMOVIMENTO AS NMTPMOVIMENTO ");
			sbSelect.append("FROM DEGGMOVIMENTO MOV ");
			sbSelect.append("INNER JOIN DEGGTIPOMOVIMENTO TPMOVIMENTO ON TPMOVIMENTO.CDTIPOMOVIMENTO = MOV.CDTIPOMOVIMENTO ");
			sbSelect.append("WHERE MOV.CDUSUARIO = ? ");
			
			String select = sbSelect.toString();
			System.out.println(select);
			
			connection = BDUtils.getConnection();
			preparedStatement = connection.prepareStatement(select);
			preparedStatement.setString(1, cdUsuario);

			resultSet = preparedStatement.executeQuery();
			while (resultSet.next()) {
				Movimento movimento = new Movimento();
				movimento.setCdUsuario(resultSet.getString("CDUSUARIO"));
				movimento.setCdMovimento(resultSet.getInt("CDMOVIMENTO"));
				movimento.setDtMovimento(resultSet.getDate("DTMOVIMENTO"));
				movimento.setVlMovimento(resultSet.getDouble("VLMOVIMENTO"));
				movimento.setFlEntradaSaida(resultSet.getString("FLENTRADASAIDA").charAt(0));
				movimento.setDeMovimento(resultSet.getString("DEMOVIMENTO"));
				movimento.setCdTipoMovimento(resultSet.getInt("CDTPMOVIMENTO"));
				movimento.setCdCrediario(resultSet.getInt("CDCREDIARIO"));
				movimento.setNuParcela(resultSet.getInt("NUPARCELA"));
				movimento.setCdConta(resultSet.getString("CDCONTA"));
				
				TipoMovimento tipoMovimento = new TipoMovimento();
				tipoMovimento.setCdTipoMovimento(resultSet.getInt("CDTPMOVIMENTO"));
				tipoMovimento.setNmTipoMovimento(resultSet.getString("NMTPMOVIMENTO"));
				
				movimento.setTipoMovimento(tipoMovimento);
				
				movimentoList.add(movimento);
			}
			
			return movimentoList;
		} catch (Exception e) {
			throw new BusinessErrorException(e);
		} finally {
			BDUtils.closeResources(connection, preparedStatement, resultSet);
		}
	}
	
	public List<TipoMovimento> findAllTipoMovimento() {
		Connection connection = null;
		PreparedStatement preparedStatement = null;
		ResultSet resultSet = null;
		List<TipoMovimento> tipoMovimentoList = new ArrayList<TipoMovimento>();
		try {
			StringBuilder sbSelect = new StringBuilder();
			sbSelect.append("SELECT TIPO.CDTIPOMOVIMENTO AS CODIGO, TIPO.NMTIPOMOVIMENTO AS NOME ");
			sbSelect.append("FROM DEGGTIPOMOVIMENTO TIPO ");
			
			String select = sbSelect.toString();
			System.out.println(select);
			
			connection = BDUtils.getConnection();
			preparedStatement = connection.prepareStatement(select);

			resultSet = preparedStatement.executeQuery();
			if (resultSet.next()) {
				TipoMovimento tipoMovimento = new TipoMovimento();
				tipoMovimento.setCdTipoMovimento(resultSet.getInt("CODIGO"));
				tipoMovimento.setNmTipoMovimento(resultSet.getString("NOME"));
				
				tipoMovimentoList.add(tipoMovimento);
			}
			
			return tipoMovimentoList;
		} catch (Exception e) {
			throw new BusinessErrorException(e);
		} finally {
			BDUtils.closeResources(connection, preparedStatement, resultSet);
		}
	}

}
